<?php

# -- DÉBUT NOTE DE LICENCE -------------------------------------
#
# Ce fichier fait partie de Clicpage.
#
# Copyright (c) 2010 Francois (www.clicpage.net)
# Distribué selon les termes de la licence GPL version 2.0.
# Consultez le fichier LICENCE ou
# http://www.gnu.org/licenses/old-licenses/gpl-2.0.html
#
# -- FIN NOTE DE LICENCE ---------------------------------------

/**
@ingroup CP_DONNEES
@nosubgrouping
@brief Actions sur un groupe d'utilisateurs

Une instance de cpGroupeUtilisateurs représente un groupe d'utilisateurs.

Ses variables membres permettent d'accéder à toutes les données du
groupes d'utilisateurs issues de la base de données.

Ses méthodes permettent, entre autres, d'effectuer les actions suivantes:
- Modifier le nom et les permissions du groupe
- Supprimer le groupe
- Obtenir la liste des utilisateurs inclus dans le groupe

*/

class cpGroupeUtilisateurs
{
	
	
	
	
	
	protected $core;			///< <b>cpCore</b>	Instance de cpCore
	
	public $groupe_id;			///< <b>integer</b>	Instance de cpCore
	public $groupe_nom;
	public $groupe_permissions;
	
	
	
	
	
	/// @name Initialisation et mise à jour des valeurs
	//@{
	
	
	/**
	Initialise une instance de cpGroupeUtilisateurs.
	
	@param	rs			<b>recordset</b>	Données de la base de données
	@param	core		<b>cpCore</b>		Référence à cpCore
	*/
	public function __construct($rs, $core)
	{
		$this->core =& $core;
		$this->initRs($rs);
	}
	
	
	/** @ignore */
	protected function initRs($rs)
	{
		$this->groupe_id 			= (integer) $rs->groupe_id;
		$this->groupe_nom 			= $rs->groupe_nom;
		$this->groupe_permissions 	= unserialize($rs->groupe_permissions);
		
		# --COMPORTEMENT-- coreInitRsGroupeUtilisateurs
		$this->core->executerComportement('coreInitRsGroupeUtilisateurs', $rs, $this);
		
	}
	
	
	/**
	Met à jour les valeurs de cpGroupeUtilisateurs pour qu'elles
	correspondent à celles de la base de données.
	
	Doit être appelée chaque fois qu'on modifie les données du
	groupe dans la base de données.
	*/
	public function rafraichir()
	{
		$rs = $this->core->site->getGroupesUtilisateurs(array(
			'groupe_id' => $this->groupe_id
		), CP_GET_RS);
		$this->initRs($rs);
	}
	//@}
	
	
	
	
	
	/// @name Actions
	//@{
	
	
	/**
	Modifie les propriétés du groupe d'utilisateurs.
	
	<var>$permissions</var> est un tableau qui contient une clé
	"permission_<nom de la permission>" pour chaque permission.
	
	@param	groupe_nom	<b>string</b>	Nom du groupe d'utilisateurs
	@param	permissions	<b>string</b>	Permissions du groupe d'utilisateurs
	*/
	public function enregistrer($groupe_nom, $permissions)
	{
		
		# Le nom du groupe ne doit pas être vide
		if(empty($groupe_nom)) {
			throw new cpErreur(__('Vous devez indiquer un nom de groupe.'), 'groupe_nom', 101);
		}
		
		# Le nom du groupe doit être unique
		$checkNom = $this->core->site->getGroupesUtilisateurs(array(
			'groupe_id' => array('!=' => array($this->groupe_id)),
			'groupe_nom' => $groupe_nom
		), CP_GET_COMPTEUR);
		
		if($checkNom->f(0) != 0) {
			throw new cpErreur(__('Ce nom de groupe est déjà utilisé.'), 'groupe_nom', 102);
		}
		
		# Curseur
		$cur = $this->core->con->openCursor($this->core->prefix.'groupes_utilisateurs');
		$cur->groupe_nom = $groupe_nom;
		$cur->groupe_permissions = serialize(self::parseFormulairePermissions($permissions, $this->core));
		
		# --COMPORTEMENT-- coreAvantEnregistrerGroupeUtilisateurs
		$this->core->executerComportement('coreAvantEnregistrerGroupeUtilisateurs', $cur, $this);
		
		# Enregistrer dans la base de données
		$cur->update('WHERE groupe_id = '.(integer) $this->groupe_id);
		
		# --COMPORTEMENT-- coreApresEnregistrerGroupeUtilisateurs
		$this->core->executerComportement('coreApresEnregistrerGroupeUtilisateurs', $cur, $this);
		
		$this->rafraichir();		
		
	}
	
	
	/**
	Analyse un formulaire et retourne un tableau contenant les
	permissions du groupe prêt à être sérialisé et enregistré
	dans la base de données.
	
	<var>$formulaire</var> contient des champs ayant pour nom
	permission_<nom de la permission> et pour valeur '1' si le
	groupe a la permission.
	
	@param	formulaire	<b>array</b>	Données de formulaire
	@param	core		<b>cpCore</b>	Référence à cpCore
	*/
	public static function parseFormulairePermissions($formulaire, $core)
	{
		
		$permissions = array();
		
		foreach($core->auth->getPermissionsDisponibles() as $k => $v)
		{
			
			$ok = true;
			
			# Vérification des préalables
			if(is_array($v[2])) {
				foreach($v[2] as $prealable) {
					if($formulaire['permission_'.$prealable] != '1') {
						$ok = false;
					}
				}
			}
			
			if($ok) {
				$permissions[$k] = $formulaire['permission_'.$k] == '1' ? true : false;
			}
			
		}

		return $permissions;
		
	}
	
	
	/**
	Supprime le groupe d'utilisateurs.
	*/
	public function supprimer()
	{
		
		# --COMPORTEMENT-- coreAvantSupprimerGroupeUtilisateurs
		$this->core->executerComportement('coreAvantSupprimerGroupeUtilisateurs', $this);
		
		$this->core->con->execute(
			'DELETE FROM '.$this->core->prefix.'groupes_utilisateurs '.
			'WHERE groupe_id = '.(integer) $this->groupe_id
		);
		
		# --COMPORTEMENT-- coreApresSupprimerGroupeUtilisateurs
		$this->core->executerComportement('coreApresSupprimerGroupeUtilisateurs', $this);
		
	}
	//@}
	
	
	
	
	
	/// @name Utilisateurs du groupe
	//@{
	
	
	/**
	Retourne la liste des utilisateurs du groupe.
	
	@param	params		<b>array</b>		Paramètres
	@param	type		<b>integer</b>		Type de résultat à retourner
	*/
	public function getUtilisateurs($params = array(), $type=CP_GET_RS)
	{
		$params['groupe_id'] = (integer) $this->groupe_id;	
		return $this->core->site->getUtilisateurs($params, $type);
	}
	//@}
	
	
}

?>